import { ref } from 'vue'
import {
	loginAPI,
	logoutAPI,
	registerAPI,
	refreshTokenAPI,
} from '@/services/login'
import { getUserInfoAPI, updateAvatarAPI } from '@/services/user'
import tokenChecker from '@/utils/token-checker'
import type { LoginParams, RegisterParams, UserTokenInfo } from '@/types'

// 用户信息状态
const userInfo = ref<UserTokenInfo | null>(null)

// 初始化：从本地存储加载用户信息
const initUserInfo = () => {
	// 从应用专用存储加载
	const storedUserInfo = uni.getStorageSync('userInfo')
	
	if (storedUserInfo) {
		userInfo.value = JSON.parse(storedUserInfo)
		// 如果用户已登录且有token，启动token检查服务
		if (userInfo.value?.access_token) {
			console.log('用户已登录，启动token检查服务')
			tokenChecker.start()
		}
	}
}

// 保存用户信息到本地存储
const saveUserInfo = () => {
	if (userInfo.value) {
		// 保存到应用专用存储
		uni.setStorageSync('userInfo', JSON.stringify(userInfo.value))
	} else {
		uni.removeStorageSync('userInfo')
	}
}

// 登录获取token（小程序优化版）
const getToken = async (data : LoginParams) => {
	return new Promise((resolve, reject) => {
		// 显示登录提示
		uni.showLoading({
			title: '登录中...',
			mask: true
		})
		
		loginAPI(data)
			.then((res) => {
				uni.hideLoading()
				
				// 合并更新 token 信息，保留原有字段
				const updatedUserInfo : any = {
					access_token: res.data.access_token,
					refresh_token: res.data.refresh_token,
					isLogin: true,
					basicAuth: `Bearer ${res.data.access_token}`,
					avatar: '',
				}
				userInfo.value = updatedUserInfo
				saveUserInfo() // 保存到本地存储
				
				// 启动token检查服务
				console.log('登录成功，启动token检查服务')
				tokenChecker.start()
				
				// 登录成功提示
				uni.showToast({
					title: '登录成功',
					icon: 'success',
					duration: 1500
				})
				
				resolve(res)
			})
			.catch((err) => {
				uni.hideLoading()
				
				// 处理特定错误
				if (err.statusCode === 401) {
					uni.showToast({
						title: '用户名或密码错误',
						icon: 'none',
						duration: 2000
					})
				} else if (err.data?.msg?.includes('在线')) {
					uni.showModal({
						title: '登录提示',
						content: '该账号已在其他应用中登录，是否继续登录？继续登录将使其他应用退出。',
						success: (modalRes) => {
							if (modalRes.confirm) {
								// 用户确认后重新尝试登录
								getToken(data).then(resolve).catch(reject)
							} else {
								reject(err)
							}
						}
					})
					return
				} else {
					uni.showToast({
						title: err.data?.msg || '登录失败',
						icon: 'none',
						duration: 2000
					})
				}
				
				reject(err)
			})
	})
}

// 查询登录用户信息
const getUserInfos = async () => {
	//查询登录用户
	await getUserInfoAPI().then((res) => {
		// 合并更新 token 信息，保留原有字段
		const updatedUserInfo : any = {
			...userInfo.value,
			userName: res.data.username,
			phone: res.data.phone,
			avatar: res.data.avatar?.replace(/^\/api/, ''),
			email: res.data.email,
			isLogin: true,
		}
		userInfo.value = updatedUserInfo
		saveUserInfo() // 保存到本地存储
	})
}

// 清理数据
const clearUser = async (skipLogoutAPI: boolean = false) => {
	try {
		// 1.后端token清除（仅在token有效时调用）
		if (!skipLogoutAPI && userInfo.value?.access_token) {
			await logoutAPI()
		}
	} catch (error) {
		// 忽略logout API的错误，避免死循环
		console.warn('logout API调用失败，继续清理本地数据:', error)
	}
	
	//2.前端token缓存清除
	userInfo.value = null
	uni.removeStorageSync('userInfo')
	
	//3.停止token检查服务
	tokenChecker.stop()
}

// 注册用户
const registerUser = async (data : RegisterParams) => {
	return new Promise((resolve, reject) => {
		registerAPI(data)
			.then((res) => {
				uni.showToast({
					title: '注册成功',
					icon: 'success'
				})
			})
			.catch((err) => {
				reject(err)
			})
	})
}

//更新用户头像
const updateAvatar = async (avatarUrl: string) => {
	return new Promise((resolve, reject) => {
		updateAvatarAPI(avatarUrl)
			.then((res) => {
				// 合并更新 token 信息，保留原有字段
				const updatedUserInfo : any = {
					...userInfo.value,
					avatar: avatarUrl,
				}
				userInfo.value = updatedUserInfo
				saveUserInfo() // 保存到本地存储
				resolve(res)
			})
			.catch((err) => {
				reject(err)
			})
	})
}

// 刷新token方法
const refreshToken = async () => {
	return new Promise((resolve, reject) => {
		if (!userInfo.value?.refresh_token) {
			reject(new Error('没有refresh_token'))
			return
		}
		
		refreshTokenAPI(userInfo.value.refresh_token)
			.then(async (res: any) => {
				if (res.data) {
					// 更新用户信息中的token
					const updatedUserInfo = {
						...userInfo.value,
						access_token: res.data.access_token,
						refresh_token: res.data.refresh_token,
						basicAuth: `Bearer ${res.data.access_token}`
					}
					
					userInfo.value = updatedUserInfo
					saveUserInfo()
					
					console.log('Token刷新成功，旧token将自然过期')
					resolve(res.data)
				} else {
					reject(new Error('刷新token失败'))
				}
			})
			.catch((err: any) => {
				console.error('刷新token失败:', err)
				reject(err)
			})
	})
}

// 导出状态和方法
export {
	userInfo,
	getToken,
	clearUser,
	registerUser,
	getUserInfos,
	updateAvatar,
	refreshToken,
	saveUserInfo,
	initUserInfo
}

